from flask import request, jsonify, session, Response

from aps.models.tipoitem import *
from aps.models.fase import *
from aps.models.grafo import *
from aps.models.lineabase import *
from aps.models.item import *


@app.route('/crear_lineabase', methods=['GET', 'POST'])
def crear_lineabase():
    """
    Nos permite traer los parametros que fueron cargados por el usuario 
    y guardarlos en la base de datos.
    @param request: objeto que encapsula la peticion del cliente
    @return : True si la accion se realizo correctamente
    """     
    nombre        = request.form['nombre']
    descripcion   = request.form['descripcion']
    received      = eval(request.form['data'])
    id_fase       = received ['id_fase']
    data          = received['data']
    # se agrega a la BD
    model         = Lineabase(nombre, descripcion, id_fase)
    bdsession.add(model)
    lineabase     = bdsession.query(Lineabase).filter_by(nombre=nombre).first()
    for id_item in data:
        item             = bdsession.query(Item).filter_by(id=id_item).first()       
        item.idlineabase = lineabase.id
        item.estado      = 'BLOQUEADO'
        bdsession.merge(item)
    return jsonify({'success' : True})
 
@app.route('/modificar_lineabase', methods=['GET', 'POST'])
def modificar_lineabase():
    """
    Nos permite traer los parametros que fueron modificados por el usuario
    y guardar los cambios en la base de datos.
    @param request: objeto que encapsula la peticion del cliente
    @return: True si la accion se realizo correctamente
    """ 
    id           = request.form['id']
    nombre       = request.form['nombre']
    descripcion  = request.form['descripcion']
    lineabase	 = bdsession.query(Lineabase).filter_by(id=id).first()
    idfase		 = lineabase.idfase
    # Se modifica en la BD
    model        = Lineabase(nombre,descripcion, idfase)
    model.id     = id
    bdsession.merge(model)   
    return jsonify({'success':True})
 
@app.route('/eliminar_lineabase', methods=['GET', 'POST'])
def eliminar_lineabase():
    """
    Nos permite traer el id de la linea base a eliminar, eliminar las dependendcias
    del mismo con respecto a otras tablas y eliminar el registro de la base de datos.
    @param request: objeto que encapsula la peticion del cliente
    @return: True si la accion se realizo correctamente y False en caso contrario 
    """ 
    id          = request.form['id']
    id_proyecto = request.form['id_proyecto']
    g = Grafo(id_proyecto)
    lineabase = bdsession.query(Lineabase).filter_by(id=id).first()
    if lineabase is None:
        return jsonify ({'success':False})
    sentencia = 'SELECT * from Item WHERE idlineabase={0}'.format(id)
    items_lb     = bdsession.query(Item).from_statement(sentencia).all()
    for item in items_lb:
        g.marcar_revision_sucesores(item.id)
        item.estado      = 'PENDIENTE'
        bdsession.merge(item)
    # eliminamos de la BD
    lineabase.eliminar_dependencias()
    bdsession.refresh(lineabase)
    bdsession.delete(lineabase)  
    return jsonify({'success':True})
 
@app.route('/consultar_lineabase', methods=['GET', 'POST'])  
def consultar_lineabase():
    """
    Nos permite traer los parametros de consulta(el filtro y el valor) y mostrar
    las lineasbases que cumplen con la condicion del filtro.
    @param request: objeto que encapsula la peticion del cliente
    @return: si la accion se realizo correctamente
    """ 
    id_fase = request.args['idfase']
    lineabases = None
    import pdb
    #pdb.set_trace()
     
    if request.args.has_key('filtro'):
        filtro     =request.args['filtro']
        valor      = request.args['valor']
        sentencia  = 'SELECT * from lineabasea WHERE idfase={0} AND {1} =\'{2}\''.format(id_fase,filtro,valor)
        lineabases = bdsession.query(Lineabase).from_statement(sentencia).all()
    else:
        lineabases = bdsession.query(Lineabase).filter_by(idfase=id_fase).all()
     
    data = []
    for llineabase in lineabases:
        item = {}
        item['id'] = llineabase.id
        item['fase'] = llineabase.idfase
        item['nombre'] = llineabase.nombre
        item['estado'] = llineabase.estado
        item['descripcion'] = llineabase.descripcion
        data.append(item)
    return jsonify({'success':True, 'data':data, 'total':len(data)})

 
@app.route('/cerrar_lineabase', methods=['GET', 'POST'])
def cerrar_lineabase():
    """
    Nos permite traer el id de la linea base a eliminar, eliminar las dependendcias
    del mismo con respecto a otras tablas y eliminar el registro de la base de datos.
    @param request: objeto que encapsula la peticion del cliente
    @return: True si la accion se realizo correctamente y False en caso contrario 
    """ 
    id       = request.form['id']
    received      = eval(request.form['data'])
    id_fase       = request.form['id_fase']
    data          = received['data']
    id_proyecto = request.form['id_proyecto']
    lineabase = bdsession.query(Lineabase).filter_by(id=id).first()
    print lineabase
    if lineabase is None:
        return jsonify ({'success':False})
    sentencia = 'SELECT * from Item WHERE idlineabase={0}'.format(id)
    items_lb     = bdsession.query(Item).from_statement(sentencia).all()
    g = Grafo(id_proyecto)
    for item in items_lb:
        if item.id not in data:
            g.marcar_revision_sucesores(item.id)
            item.estado      = 'PENDIENTE'
            bdsession.merge(item)
    # se agrega a la BD
    items_lb2     = bdsession.query(Item).from_statement(sentencia).all()
    for id_item in data:
        item             = bdsession.query(Item).filter_by(id=id_item).first()
        if item.idlineabase is None:         
            item.idlineabase= lineabase.id
            item.estado      = 'BLOQUEADO'
            bdsession.merge(item)
    
    # eliminamos de la BD
    lineabase.estado = "Cerrada"  
    return jsonify({'success':True})
